16.4 Die Klasse »RadioButton« (Optionsschaltflächen)  
16.4.1 Die Gruppierung der Optionsschaltflächen  
Kontrollkästchen können einzeln auftreten und mit einem Ein-/Aus-Schalter verglichen werden. Mehrere Kontrollkästchen in einem Container wie der Form sind völlig unabhängig voneinander und beeinflussen sich nicht gegenseitig. Die aus der Klasse RadioButton instanziierten Optionsschaltflächen ähneln den Kontrollkästchen, unterscheiden sich von diesen und allen anderen Steuerelementen allerdings in zwei wesentlichen Punkten:
|
Optionsfelder treten niemals einzeln, sondern immer nur in einer Gruppe auf. |
|
Die Optionsschaltflächen einer Gruppe beeinflussen sich gegenseitig, weil aus einer Gruppe nur eine einzige aktiviert sein kann. |
Optionsschaltflächen, die zu einer Gruppe gehören, befinden sich im gleichen Container. Im einfachsten Fall ist das die Form. Benötigen Sie in einer Form mehrere unabhängige Optionsschaltflächengruppen, kann die Form diese Anforderung nicht mehr alleine erfüllen. Es wird ein weiteres, gruppierendes Steuerelement benötigt. Dazu bieten sich zwei an:
|
ein GroupBox-Steuerelement, das gleichzeitig auch einen Rahmen um die eingeschlossene Gruppe anzeigt, oder |
|
ein Panel-Steuerelement. Diesem haftet allerdings der Nachteil an, dass es sich mit seinen Standardeinstellungen optisch nicht vom Clientbereich der Form abhebt. |
 Hier klicken, um das Bild zu Vergrößern
Abbildung 16.7 Gruppierung von Optionsschaltflächen
Abbildung 16.7 zeigt zwei Optionsschaltflächengruppen in einem Formular: Eine Gruppe ist der Form zugeordnet (männlich und weiblich), die andere einem GroupBox-Steuerelement. Die Form als Container einer Gruppe von Optionsschaltflächen zu benutzen, ist oft keine gute Lösung und dient hier nur der Demonstration, dass sich prinzipiell sowohl eine Form als auch ein GroupBox-Steuerelement als Container von Optionsschaltflächen eignen.
Klickt der Anwender auf die Schaltfläche männlich, wird diese aktiviert und gleichzeitig die Aktivierung von weiblich aufgehoben. Die Optionsschaltflächen in der durch die Groupbox beschriebenen Gruppe bleiben davon unbeeindruckt. Analog verhalten sich auch die Optionsschaltflächen in der GroupBox, wenn ein anderes Element ausgewählt wird: Die Selektierung von Gewerblicher wird die Voreinstellung der Option Angestellter aufheben, ohne dass sich das auf die der Form zugeordneten Optionsschaltflächen auswirken wird.
Der Grund, weshalb sich ein Formular weniger gut als Gruppierungselement eignet, ist das unterschiedliche Navigationsverhalten der beiden Gruppierungen. Innerhalb einer durch eine Groupbox definierten Gruppe werden die Pfeiltasten verwendet, um den Fokus zwischen den einzelnen Steuerelementen zu verschieben. Es wird genau das Element durch einen schwarzen Punkt als aktiviert gekennzeichnet, das innerhalb der Gruppe aktuell im Besitz des Fokus ist. Die (Tab)-Taste dient zum Wechsel zwischen den GroupBox-Steuerelementen. Dabei bleibt die Optionsschaltfläche aktiviert, die innerhalb der Gruppe zuletzt fokussiert war.
16.4.2 Die Eigenschaften von Optionsschaltflächen  
Die Liste der Eigenschaften einer Optionsschaltfläche ähnelt der des Kontrollkästchens. Der Auswahlzustand wird durch die Eigenschaft Checked beschrieben. Der Standardwert ist False und beschreibt eine nicht aktivierte Optionsschaltfläche. Die Ausrichtung der Beschriftung mit TextAlign, die des Aktivierungspunktes mit CheckAlign sowie die Fähigkeit, der Anzeige des Steuerelements durch ein Bild optisch eine besondere Note zu verleihen, haben wir bereits gesehen.
Auch Optionsschaltflächen haben eine Eigenschaft Appearance. Mit
Appearance = Appearance.Button
wird die Optionsschaltfläche wie eine herkömmliche Schaltfläche aussehen. Das grundsätzliche Verhalten von Optionsschaltflächen innerhalb einer Gruppierung, sich gegenseitig auszuschließen, ändert sich dadurch natürlich nicht. Es kann immer nur eine Schaltfläche aktiv sein und sich im gedrückten Zustand darstellen.
16.4.3 Den Zustandswechsel programmieren  
Wie die Klasse CheckBox so löst auch die Klasse RadioButton das Ereignis CheckedChanged aus. Allerdings sollten Sie hierbei aufpassen, denn das Auslösen dieses Ereignisses bei einer Optionsschaltfläche unterscheidet sich von dem eines Kontrollkästchens. Bei einem CheckBox-Steuerelement wird das Ereignis ausgelöst, sobald sich dessen Zustand ändert. Die Checkbox bleibt dabei fokussiert. Sehen wir uns nun dasselbe Ereignis an, wenn es durch eine Optionsschaltfläche ausgelöst wird. Dazu nehmen wir an, die beiden in der Gruppe Position der Abbildung 16.7 enthaltenen Optionsschaltflächen hätten die folgende Implementierung des CheckedChanged-Ereignisses:
| Private Sub rdbAngestellter_CheckedChanged(ByVal sender As Object, _
|
| ByVal e As EventArgs) Handles rdbAngestellter.CheckedChanged
|
| MessageBox.Show("Angestellter")
|
| End Sub
|
| Private Sub rdbGewerblicher_CheckedChanged(ByVal sender As Object, _
|
| ByVal e As EventArgs) Handles rdbGewerblicher.CheckedChanged
|
| MessageBox.Show("Gewerblicher")
|
| End Sub
|
Starten wir die Anwendung und navigieren mit der Tabulatortaste in die Gruppe Position, wird zuerst die Optionsschaltfläche den Fokus erhalten, der zur Entwicklungszeit der Status Checked=True zugewiesen worden ist. Wechseln Sie danach innerhalb der Gruppe auf die nächste Optionsschaltfläche, verliert das aktive Element den Fokus und damit auch seinen Aktivierungszustand. Die Folge ist die Auslösung von CheckedChanged. Anschließend erhält das nächste in der Aktivierungsreihenfolge stehende Element den Fokus, wird aktiviert und löst seinerseits ebenfalls CheckedChanged aus.
Es kommt bei einem Wechsel des Aktivierungszustands immer zu zwei CheckedChanged-Ereignissen: zuerst bei dem Element, das seine Aktivierung verliert, und danach bei dem, das neu ausgewählt wurde. Bei der Ereignisauslösung haben die Optionsschaltflächen bereits ihren neuen Checked-Zustand. Weil keine Aussage darüber getroffen ist, wie der Zustand der Schaltfläche bei der Ereignisauslösung ist, muss dieser gegebenenfalls mit
| Private Sub radioButton1_CheckedChanged(...)
|
| If radioButton1.Checked Thden
|
| ...
|
| End If
|
| End Sub
|
überprüft werden.
|